#include #include #include #include using std::string; using std::cout; using std::cin; using std::endl; struct FileHeader { char headerField[2]; unsigned int fileSize; void display(); }; void FileHeader::display() { cout << "headerField: " << headerField[0] << headerField[1] << endl; cout << "fileSize: " << fileSize << endl; } struct ImageHeader { unsigned int headerSize; void display(); }; void ImageHeader::display() { } struct Pixel { unsigned char blue; unsigned char green; unsigned char red; }; struct Image { FileHeader fileHeader; ImageHeader imageHeader; // an array of pixels Image( char fileName[]); void displayHeaders(); }; Image::Image(char fileName[]) { std::ifstream fin(fileName, std::ios::binary); //first argument must be an address (char*) //file pointers - (put)p pointer, (get)g pointer fin.read(fileHeader.headerField,2); //(char*) type cast fin.read((char*)&fileHeader.fileSize,4); //because I am not reading, it is your job fin.seekg(54,std::ios::beg); int width = 3; // should be read from file header int height = 4; // should be read from file header Pixel pixel; for(int row = 0; row < height; row++ ) { for(int column = 0; column < width; column++) { fin.read((char*)&pixel.blue,1); fin.read((char*)&pixel.green,1); fin.read((char*)&pixel.red,1); //read blue, green red } } fin.close(); } void Image::displayHeaders() { fileHeader.display(); imageHeader.display(); } int garbageBytesPerRow(int imageWidth) { int result = 0; int imageBytesPerRow = imageWidth * 3; while((imageBytesPerRow + result )%4 != 0) { result++; } return result; } void main() { Image image("Untitled.bmp"); image.displayHeaders(); cout << garbageBytesPerRow(3) << endl; cout << garbageBytesPerRow(4) << endl; cout << garbageBytesPerRow(5) << endl; cout << garbageBytesPerRow(200) << endl; }